// app.js
App({
  globalData: {
    userInfo: null,
    token: null,
    baseUrl: 'http://127.0.0.1:8000/api/v1', // 本地开发环境API地址
    cartCount: 0
  },

  onLaunch() {
    // 小程序启动时执行：优先从本地恢复，其次自动登录
    this.checkLogin()
    if (this.globalData.token && this.globalData.userInfo) {
      this.getCartCount()
    } else {
      this.login()
        .then(() => {
          this.getCartCount()
        })
        .catch((err) => {
          console.log('自动登录失败:', err)
        })
    }
  },

  onShow() {
    // 小程序显示时执行
  },

  onHide() {
    // 小程序隐藏时执行
  },

  onError(msg) {
    console.error('小程序错误:', msg)
  },

  // 检查登录状态
  checkLogin() {
    const token = wx.getStorageSync('token')
    const userInfo = wx.getStorageSync('userInfo')
    
    if (token && userInfo) {
      this.globalData.token = token
      this.globalData.userInfo = userInfo
    }
  },

  // 微信登录
  login() {
    return new Promise((resolve, reject) => {
      wx.login({
        success: (res) => {
          if (res.code) {
            // 发送登录请求（不再获取用户信息）
            this.request({
              url: '/users/wechat_login/',
              method: 'POST',
              data: {
                code: res.code
              }
            }).then(response => {
              console.log('app.js登录响应:', response)
              if (response.success) {
                const { user, token } = response.data
                console.log('app.js解析的用户数据:', user)
                console.log('app.js解析的token:', token)
                
                this.globalData.userInfo = user
                this.globalData.token = token
                
                // 存储到本地
                wx.setStorageSync('userInfo', user)
                wx.setStorageSync('token', token)
                
                resolve(user)
              } else {
                reject(response.message)
              }
            }).catch(reject)
          } else {
            reject('获取登录凭证失败')
          }
        },
        fail: reject
      })
    })
  },

  // 静默登录（检查是否已登录）
  silentLogin() {
    return new Promise((resolve, reject) => {
      // 先检查本地存储
      const token = wx.getStorageSync('token')
      const userInfo = wx.getStorageSync('userInfo')
      
      if (token && userInfo) {
        // 先设置到全局数据，避免网络请求失败时丢失数据
        this.globalData.userInfo = userInfo
        this.globalData.token = token
        
        // 验证token是否有效（网络请求失败不清空数据）
        this.request({
          url: '/users/profile/',
          method: 'GET'
        }).then(response => {
          if (response.success) {
            // token有效，更新用户信息
            this.globalData.userInfo = response.data
            wx.setStorageSync('userInfo', response.data)
            resolve(response.data)
          } else {
            // token无效才清除数据
            this.logout()
            reject('登录已过期')
          }
        }).catch(() => {
          // 网络请求失败，使用本地数据，不清空
          console.log('网络请求失败，使用本地用户数据')
          resolve(userInfo)
        })
      } else {
        reject('未登录')
      }
    })
  },

  // 保存登录状态
  saveLoginState(token, userInfo) {
    this.globalData.token = token
    this.globalData.userInfo = userInfo
    wx.setStorageSync('token', token)
    wx.setStorageSync('userInfo', userInfo)
  },

  // 清除登录状态
  clearLoginState() {
    this.globalData.userInfo = null
    this.globalData.token = null
    wx.removeStorageSync('userInfo')
    wx.removeStorageSync('token')
  },

  // 退出登录
  logout() {
    this.clearLoginState()
  },

  // 网络请求封装
  request(options) {
    return new Promise((resolve, reject) => {
      const { url, method = 'GET', data = {}, header = {} } = options
      
      // 添加凭证
      if (this.globalData.token) {
        header['Authorization'] = `Bearer ${this.globalData.token}`
      }
      // 兜底用户ID，用于后端在未认证时识别用户
      if (this.globalData.userInfo && this.globalData.userInfo.id) {
        header['X-USER-ID'] = String(this.globalData.userInfo.id)
      }
      
      wx.request({
        url: this.globalData.baseUrl + url,
        method,
        data,
        header: {
          'Content-Type': 'application/json',
          ...header
        },
        success: (res) => {
          if (res.statusCode === 200) {
            resolve(res.data)
          } else if (res.statusCode === 401) {
            // 401：可选跳过自动登出，避免未登录时清空会话
            if (!(options && options.skipLogoutOn401)) {
              this.logout()
              wx.showToast({
                title: '请重新登录',
                icon: 'none'
              })
            }
            reject('未授权')
          } else {
            reject(res.data?.message || '请求失败')
          }
        },
        fail: (err) => {
          wx.showToast({
            title: '网络错误',
            icon: 'none'
          })
          reject(err)
        }
      })
    })
  },

  // 获取购物车数量
  getCartCount() {
    if (!this.globalData.token) return
    
    this.request({
      url: '/orders/cart/total/',
      // 未登录或会话未就绪时，可能返回401，这里不清空登录状态
      skipLogoutOn401: true
    }).then(response => {
      if (response.success) {
        this.globalData.cartCount = response.data.total_count || 0
        this.updateTabBarBadge()
      }
    }).catch(() => {
      // 忽略错误
    })
  },

  // 更新购物车角标
  updateTabBarBadge() {
    if (this.globalData.cartCount > 0) {
      wx.setTabBarBadge({
        index: 2,
        text: this.globalData.cartCount.toString()
      })
    } else {
      wx.removeTabBarBadge({
        index: 2
      })
    }
  },

  // 显示加载中
  showLoading(title = '加载中...') {
    wx.showLoading({
      title,
      mask: true
    })
  },

  // 隐藏加载中
  hideLoading() {
    wx.hideLoading()
  },

  // 显示提示
  showToast(title, icon = 'success') {
    wx.showToast({
      title,
      icon,
      duration: 2000
    })
  },

  // 显示确认对话框
  showModal(title, content) {
    return new Promise((resolve) => {
      wx.showModal({
        title,
        content,
        success: (res) => {
          resolve(res.confirm)
        }
      })
    })
  }
})